home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / text / edit / vim60rt.lha / Vim / vim60 / syntax / perl.vim < prev    next >
Encoding:
Text File  |  2001-08-31  |  26.7 KB  |  519 lines

  1. " Vim syntax file
  2. " Language:    Perl
  3. " Maintainer:    Nick Hibma <n_hibma@webweaving.org>
  4. " Last Change:    2001 Aug 31
  5. " Location:    http://www.etla.net/~n_hibma/vim/syntax/perl.vim
  6. "
  7. " Please download most recent version first before mailing
  8. " any comments.
  9. " See also the file perl.vim.regression.pl to check whether your
  10. " modifications work in the most odd cases
  11. " http://www.etla.net/~n_hibma/vim/syntax/perl.vim.regression.pl
  12. "
  13. " Original version: Sonia Heimann <niania@netsurf.org>
  14. " Thanks to many people for their contribution. They made it work, not me.
  15.  
  16. " The following parameters are available for tuning the
  17. " perl syntax highlighting, with defaults given:
  18. "
  19. " unlet perl_include_pod
  20. " unlet perl_want_scope_in_variables
  21. " unlet perl_extended_vars
  22. " unlet perl_string_as_statement
  23. " unlet perl_no_sync_on_sub
  24. " unlet perl_no_sync_on_global_var
  25. " let perl_sync_dist = 100
  26. " unlet perl_fold
  27.  
  28. " Remove any old syntax stuff that was loaded (5.x) or quit when a syntax file
  29. " was already loaded (6.x).
  30. if version < 600
  31.   syntax clear
  32. elseif exists("b:current_syntax")
  33.   finish
  34. endif
  35.  
  36. " Unset perl_fold if it set but vim doesn't support it.
  37. if version < 600 && exists("perl_fold")
  38.   unlet perl_fold
  39. endif
  40.  
  41.  
  42. " POD starts with ^=<word> and ends with ^=cut
  43.  
  44. if exists("perl_include_pod")
  45.   " Include a while extra syntax file
  46.   syn include @Pod <sfile>:p:h/pod.vim
  47.   unlet b:current_syntax
  48.   if exists("perl_fold")
  49.     syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend fold
  50.   else
  51.     syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend
  52.   endif
  53. else
  54.   " Use only the bare minimum of rules
  55.   if exists("perl_fold")
  56.     syn region perlPOD start="^=[a-z]" end="^=cut" fold
  57.   else
  58.     syn region perlPOD start="^=[a-z]" end="^=cut"
  59.   endif
  60. endif
  61.  
  62.  
  63. " All keywords
  64. "
  65. syn keyword perlConditional        if elsif unless switch eq ne gt lt ge le cmp not and or xor
  66. syn keyword perlConditional        else nextgroup=perlElseIfError skipwhite skipnl skipempty
  67. syn keyword perlRepeat            while for foreach do until
  68. syn keyword perlOperator        defined undef and or not bless ref
  69. if exists("perl_fold")
  70.   " BUG bug in Vim if BEGIN/END is a keyword the perlBEGINENDFold does not work
  71.   syn match perlControl            "BEGIN" contained
  72.   syn match perlControl            "END" contained
  73. else
  74.   syn keyword perlControl        BEGIN END
  75. endif
  76.  
  77. syn keyword perlStatementStorage    my local our
  78. syn keyword perlStatementControl    goto return last next continue redo
  79. syn keyword perlStatementScalar        chomp chop chr crypt index lc lcfirst length ord pack reverse rindex sprintf substr uc ucfirst
  80. syn keyword perlStatementRegexp        pos quotemeta split study
  81. syn keyword perlStatementNumeric    abs atan2 cos exp hex int log oct rand sin sqrt srand
  82. syn keyword perlStatementList        splice unshift shift push pop split join reverse grep map sort unpack
  83. syn keyword perlStatementHash        each exists keys values tie tied untie
  84. syn keyword perlStatementIOfunc        carp confess croak dbmclose dbmopen die syscall
  85. syn keyword perlStatementFiledesc    binmode close closedir eof fileno getc lstat print printf readdir readline readpipe rewinddir select stat tell telldir write nextgroup=perlFiledescStatementNocomma
  86. syn keyword perlStatementFiledesc    fcntl flock ioctl open opendir read seek seekdir sysopen sysread sysseek syswrite truncate nextgroup=perlFiledescStatementComma
  87. syn keyword perlStatementVector        pack vec
  88. syn keyword perlStatementFiles        chdir chmod chown chroot glob link mkdir readlink rename rmdir symlink umask unlink utime
  89. syn match   perlStatementFiles        "-[rwxoRWXOezsfdlpSbctugkTBMAC]\>"
  90. syn keyword perlStatementFlow        caller die dump eval exit wantarray
  91. syn keyword perlStatementInclude    require
  92. syn match   perlStatementInclude    "\(use\|no\)\s\+\(integer\>\|strict\>\|lib\>\|sigtrap\>\|subs\>\|vars\>\|warnings\>\|utf8\>\|byte\>\)\="
  93. syn keyword perlStatementScope        import
  94. syn keyword perlStatementProc        alarm exec fork getpgrp getppid getpriority kill pipe setpgrp setpriority sleep system times wait waitpid
  95. syn keyword perlStatementSocket        accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
  96. syn keyword perlStatementIPC        msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
  97. syn keyword perlStatementNetwork    endhostent endnetent endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
  98. syn keyword perlStatementPword        getpwuid getpwnam getpwent setpwent endpwent getgrent getgrgid getlogin getgrnam setgrent
  99. syn keyword perlStatementTime        gmtime localtime time times
  100.  
  101. syn keyword perlStatementMisc        warn formline reset scalar new delete prototype lock
  102.  
  103. syn keyword perlTodo            TODO TBD FIXME XXX contained
  104.  
  105. " Perl Identifiers.
  106. "
  107. " Should be cleaned up to better handle identifiers in particular situations
  108. " (in hash keys for example)
  109. "
  110. " Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
  111. " We do not process complex things such as @{${"foo"}}. Too complicated, and
  112. " too slow. And what is after the -> is *not* considered as part of the
  113. " variable - there again, too complicated and too slow.
  114.  
  115. " Special variables first ($^A, ...) and ($|, $', ...)
  116. syn match  perlVarPlain         "$^[ADEFHILMOPSTWX]\="
  117. syn match  perlVarPlain         "$[\\\"\[\]'&`+*.,;=%~!?@$<>(0-9-]"
  118. " Same as above, but avoids confusion in $::foo (equivalent to $main::foo)
  119. syn match  perlVarPlain         "$:[^:]"
  120. " These variables are not recognized within matches.
  121. syn match  perlVarNotInMatches     "$[|)]"
  122. " This variable is not recognized within matches delimited by m//.
  123. syn match  perlVarSlash         "$/"
  124.  
  125. " And plain identifiers
  126. syn match  perlPackageRef     "\(\h\w*\)\=\(::\|'\)\I"me=e-1 contained
  127.  
  128. " To highlight packages in variables as a scope reference - i.e. in $pack::var,
  129. " pack:: is a scope, just set "perl_want_scope_in_variables"
  130. " If you *want* complex things like @{${"foo"}} to be processed,
  131. " just set the variable "perl_extended_vars"...
  132.  
  133. " FIXME value between {} should be marked as string. is treated as such by Perl.
  134. " At the moment it is marked as something greyish instead of read. Probably todo
  135. " with transparency. Or maybe we should handle the bare word in that case. or make it into
  136.  
  137. if exists("perl_want_scope_in_variables")
  138.   syn match  perlVarPlain    "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
  139.   syn match  perlFunctionName    "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember
  140. else
  141.   syn match  perlVarPlain    "\\\=\([@%$]\|\$#\)\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
  142.   syn match  perlFunctionName    "\\\=&\$*\(\I\i*\)\=\(\(::\|'\)\I\i*\)*\>" nextgroup=perlVarMember,perlVarSimpleMember
  143. endif
  144.  
  145. if exists("perl_extended_vars")
  146.   syn cluster perlExpr        contains=perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ
  147.   syn region perlVarBlock    matchgroup=perlVarPlain start="\($#\|[@%$]\)\$*{" skip="\\}" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
  148.   syn region perlVarBlock    matchgroup=perlVarPlain start="&\$*{" skip="\\}" end="}" contains=@perlExpr
  149.   syn match  perlVarPlain    "\\\=\(\$#\|[@%&$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember
  150.   syn region perlVarMember    matchgroup=perlVarPlain start="\(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
  151.   syn match  perlVarSimpleMember    "\(->\)\={\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember contains=perlVarSimpleMemberName contained
  152.   syn match  perlVarSimpleMemberName    "\I\i*" contained
  153.   syn region perlVarMember    matchgroup=perlVarPlain start="\(->\)\=\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember
  154. endif
  155.  
  156. " File Descriptors
  157. syn match  perlFiledescRead    "[<]\h\w\+[>]"
  158.  
  159. syn match  perlFiledescStatementComma    "\s*(\=\s*\h\w*\>\s*," transparent contained contains=perlFiledescStatement
  160. syn match  perlFiledescStatementNocomma    "\s*(\=\s*\h\w*\>\(\s\+[^,]\|\s*;\)"me=e-1 transparent contained contains=perlFiledescStatement
  161.  
  162. syn match  perlFiledescStatement    "\h\w\+" contained
  163.  
  164. " Special characters in strings and matches
  165. syn match  perlSpecialString    "\\\(\d\+\|[xX]\x\+\|c\u\|.\)" contained
  166. syn match  perlSpecialStringU    "\\['\\]" contained
  167. syn match  perlSpecialMatch    "{\d\(,\d\)\=}" contained
  168. syn match  perlSpecialMatch    "\[\(\]\|-\)\=[^\[\]]*\(\[\|\-\)\=\]" contained
  169. syn match  perlSpecialMatch    "[+*()?.]" contained
  170. syn match  perlSpecialMatch    "(?[#:=!]" contained
  171. syn match  perlSpecialMatch    "(?[imsx]\+)" contained
  172. " FIXME the line below does not work. It should mark end of line and
  173. " begin of line as perlSpecial.
  174. " syn match perlSpecialBEOM    "^\^\|\$$" contained
  175.  
  176. " Possible errors
  177. "
  178. " Highlight lines with only whitespace (only in blank delimited here documents) as errors
  179. syn match  perlNotEmptyLine    "^\s\+$" contained
  180. " Highlight '} else if (...) {', it should be '} else { if (...) { ' or
  181. " '} elsif (...) {'.
  182. syn keyword perlElseIfError    if contained
  183.  
  184. " Variable interpolation
  185. "
  186. " These items are interpolated inside "" strings and similar constructs.
  187. syn cluster perlInterpDQ    contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
  188. " These items are interpolated inside '' strings and similar constructs.
  189. syn cluster perlInterpSQ    contains=perlSpecialStringU
  190. " These items are interpolated inside m// matches and s/// substitutions.
  191. syn cluster perlInterpSlash    contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock,perlSpecialBEOM
  192. " These items are interpolated inside m## matches and s### substitutions.
  193. syn cluster perlInterpMatch    contains=@perlInterpSlash,perlVarSlash
  194.  
  195. " Shell commands
  196. syn region  perlShellCommand    matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ
  197.  
  198. " Constants
  199. "
  200. " Numbers
  201. syn match  perlNumber        "[-+]\=\(\<\d[[:digit:]_]*L\=\>\|0[xX]\x[[:xdigit:]_]*\>\)"
  202. syn match  perlFloat        "[-+]\=\<\d[[:digit:]_]*[eE][\-+]\=\d\+"
  203. syn match  perlFloat        "[-+]\=\<\d[[:digit:]_]*\.[[:digit:]_]*\([eE][\-+]\=\d\+\)\="
  204. syn match  perlFloat        "[-+]\=\<\.[[:digit:]_]\+\([eE][\-+]\=\d\+\)\="
  205.  
  206.  
  207. " Simple version of searches and matches
  208. " caters for m//, m## and m[] (and the !/ variant)
  209. syn region perlMatch        matchgroup=perlMatchStartEnd start=+[m!]/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
  210. syn region perlMatch        matchgroup=perlMatchStartEnd start=+[m!]#+ end=+#[cgimosx]*+ contains=@perlInterpMatch
  211. syn region perlMatch        matchgroup=perlMatchStartEnd start=+[m!]\[+ end=+\][cgimosx]*+ contains=@perlInterpMatch
  212.  
  213. " A special case for m!!x which allows for comments and extra whitespace in the pattern
  214. syn region perlMatch        matchgroup=perlMatchStartEnd start=+[m!]!+ end=+![cgimosx]*+ contains=@perlInterpSlash,perlComment
  215.  
  216. " Below some hacks to recognise the // variant. This is virtually impossible to catch in all
  217. " cases as the / is used in so many other ways, but these should be the most obvious ones.
  218. "syn region perlMatch        matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^if /+lc=2 start=+[^$@%]if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
  219. syn region perlMatch        matchgroup=perlMatchStartEnd start=+^split /+lc=5 start=+[^$@%]\<split /+lc=6 start=+^while /+lc=5 start=+[^$@%]while /+lc=6 start=+^if /+lc=2 start=+[^$@%]if /+lc=3 start=+[!=]\~\s*/+lc=2 start=+[(~]/+lc=1 start=+\.\./+lc=2 start=+\s/[^= \t0-9$@%]+lc=1,me=e-1,rs=e-1 start=+^/+ skip=+\\/+ end=+/[cgimosx]*+ contains=@perlInterpSlash
  220.  
  221.  
  222. " Substitutions
  223. " caters for s///, s### and s[][]
  224. " perlMatch is the first part, perlSubstitution* is the substitution part
  225. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ
  226. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s"+ end=+"+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionDQ
  227. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionSlash
  228. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionHash
  229. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s\[+ end=+\]+ contains=@perlInterpMatch nextgroup=perlSubstitutionBracket skipwhite skipempty skipnl
  230. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s{+ end=+}+ contains=@perlInterpMatch nextgroup=perlSubstitutionCurly skipwhite skipempty skipnl
  231. syn region perlSubstitutionSQ        matchgroup=perlMatchStartEnd start=+'+ end=+'[ecgimosx]*+ contained contains=@perlInterpSQ
  232. syn region perlSubstitutionDQ        matchgroup=perlMatchStartEnd start=+"+ end=+"[ecgimosx]*+ contained contains=@perlInterpDQ
  233. syn region perlSubstitutionSlash    matchgroup=perlMatchStartEnd start=+/+ end=+/[ecgimosx]*+ contained contains=@perlInterpDQ
  234. syn region perlSubstitutionHash        matchgroup=perlMatchStartEnd start=+#+ end=+#[ecgimosx]*+ contained contains=@perlInterpDQ
  235. syn region perlSubstitutionBracket    matchgroup=perlMatchStartEnd start=+\[+ end=+\][ecgimosx]*+ contained contains=@perlInterpDQ
  236. syn region perlSubstitutionCurly    matchgroup=perlMatchStartEnd start=+{+ end=+}[ecgimosx]*+ contained contains=@perlInterpDQ
  237.  
  238. " A special case for m!!x which allows for comments and extra whitespace in the pattern
  239. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<s!+ end=+!+me=e-1 contains=@perlInterpSlash,perlComment nextgroup=perlSubstitutionPling
  240. syn region perlSubstitutionPling    matchgroup=perlMatchStartEnd start=+!+ end=+![ecgimosx]*+ contained contains=@perlInterpDQ
  241.  
  242. " Substitutions
  243. " caters for tr///, tr### and tr[][]
  244. " perlMatch is the first part, perlTranslation* is the second, translator part.
  245. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSQ
  246. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)"+ end=+"+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationDQ
  247. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)/+ end=+/+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationSlash
  248. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationHash
  249. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\)\[+ end=+\]+ contains=@perlInterpSQ nextgroup=perlTranslationBracket skipwhite skipempty skipnl
  250. syn region perlMatch        matchgroup=perlMatchStartEnd start=+\<\(tr\|y\){+ end=+}+ contains=@perlInterpSQ nextgroup=perlTranslationCurly skipwhite skipempty skipnl
  251. syn region perlTranslationSQ        matchgroup=perlMatchStartEnd start=+'+ end=+'[cds]*+ contained
  252. syn region perlTranslationDQ        matchgroup=perlMatchStartEnd start=+"+ end=+"[cds]*+ contained
  253. syn region perlTranslationSlash        matchgroup=perlMatchStartEnd start=+/+ end=+/[cds]*+ contained
  254. syn region perlTranslationHash        matchgroup=perlMatchStartEnd start=+#+ end=+#[cds]*+ contained
  255. syn region perlTranslationBracket    matchgroup=perlMatchStartEnd start=+\[+ end=+\][cds]*+ contained
  256. syn region perlTranslationCurly        matchgroup=perlMatchStartEnd start=+{+ end=+}[cds]*+ contained
  257.  
  258.  
  259. " The => operator forces a bareword to the left of it to be interpreted as
  260. " a string
  261. syn match  perlString "\<\I\i*\s*=>"me=e-2
  262.  
  263. " Strings and q, qq, qw and qr expressions
  264.  
  265. " Brackets in qq()
  266. syn region perlBrackets        start=+(+ end=+)+ contained transparent contains=perlBrackets,@perlStringSQ
  267.  
  268. syn region perlStringUnexpanded    matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ
  269. syn region perlString        matchgroup=perlStringStartEnd start=+"+  end=+"+ contains=@perlInterpDQ
  270. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q#+ end=+#+ contains=@perlInterpSQ
  271. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q|+ end=+|+ contains=@perlInterpSQ
  272. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q(+ end=+)+ contains=@perlInterpSQ,perlBrackets
  273. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q{+ end=+}+ contains=@perlInterpSQ
  274. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q/+ end=+/+ contains=@perlInterpSQ
  275. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q[qx]#+ end=+#+ contains=@perlInterpDQ
  276. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q[qx]|+ end=+|+ contains=@perlInterpDQ
  277. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q[qx](+ end=+)+ contains=@perlInterpDQ,perlBrackets
  278. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q[qx]{+ end=+}+ contains=@perlInterpDQ
  279. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<q[qx]/+ end=+/+ contains=@perlInterpDQ
  280. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qw#+  end=+#+ contains=@perlInterpSQ
  281. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qw|+  end=+|+ contains=@perlInterpSQ
  282. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qw(+  end=+)+ contains=@perlInterpSQ,perlBrackets
  283. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qw{+  end=+}+ contains=@perlInterpSQ
  284. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qw/+  end=+/+ contains=@perlInterpSQ
  285. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qr#+  end=+#[imosx]*+ contains=@perlInterpMatch
  286. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qr|+  end=+|[imosx]*+ contains=@perlInterpMatch
  287. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qr(+  end=+)[imosx]*+ contains=@perlInterpMatch
  288. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qr{+  end=+}[imosx]*+ contains=@perlInterpMatch
  289. syn region perlQQ        matchgroup=perlStringStartEnd start=+\<qr/+  end=+/[imosx]*+ contains=@perlInterpSlash
  290.  
  291. " Constructs such as print <<EOF [...] EOF, 'here' documents
  292. "
  293. if version >= 600
  294.   " XXX Any statements after the identifier are in perlString colour (i.e.
  295.   " 'if $a' in 'print <<EOF if $a').
  296.   if exists("perl_fold")
  297.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+     end=+^\z1$+ contains=@perlInterpDQ fold
  298.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*"\z(\S\+\)"+ end=+^\z1$+ contains=@perlInterpDQ fold
  299.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*'\z(\S\+\)'+ end=+^\z1$+ contains=@perlInterpSQ fold
  300.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*""+          end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine fold
  301.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*''+          end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine fold
  302.   else
  303.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\z(\I\i*\)+     end=+^\z1$+ contains=@perlInterpDQ
  304.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*"\z(\S\+\)"+ end=+^\z1$+ contains=@perlInterpDQ
  305.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*'\z(\S\+\)'+ end=+^\z1$+ contains=@perlInterpSQ
  306.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*""+          end=+^$+    contains=@perlInterpDQ,perlNotEmptyLine
  307.     syn region perlHereDoc    matchgroup=perlStringStartEnd start=+<<\s*''+          end=+^$+    contains=@perlInterpSQ,perlNotEmptyLine
  308.   endif
  309. else
  310.   syn match perlUntilEOFStart    "<<EOF.*"lc=5 nextgroup=perlUntilEOFDQ skipnl transparent
  311.   syn match perlUntilEOFStart    "<<\s*\"EOF\".*" nextgroup=perlUntilEOFDQ skipnl transparent
  312.   syn match perlUntilEOFStart    "<<\s*'EOF'.*" nextgroup=perlUntilEOFSQ skipnl transparent
  313.   syn match perlUntilEOFStart    "<<\s*\"\".*" nextgroup=perlUntilEmptyDQ skipnl transparent
  314.   syn match perlUntilEOFStart    "<<\s*''.*" nextgroup=perlUntilEmptySQ skipnl transparent
  315.   syn region perlUntilEOFDQ    matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpDQ contained
  316.   syn region perlUntilEOFSQ    matchgroup=perlStringStartEnd start=++ end="^EOF$" contains=@perlInterpSQ contained
  317.   syn region perlUntilEmptySQ    matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpDQ,perlNotEmptyLine contained
  318.   syn region perlUntilEmptyDQ    matchgroup=perlStringStartEnd start=++ end="^$" contains=@perlInterpSQ,perlNotEmptyLine contained
  319.   syn match perlHereIdentifier    "<<EOF"
  320. endif
  321.  
  322.  
  323. " Class declarations
  324. "
  325. syn match  perlPackageDecl    "^\s*package\s\+\S\+" contains=perlStatementPackage
  326. syn keyword perlStatementPackage    package contained
  327.  
  328. " Functions
  329. "       sub [name] [(prototype)] {
  330. "
  331. syn region perlFunction        start="\s*sub\>" end="[;{]"he=e-1 contains=perlStatementSub,perlFunctionPrototype,perlFunctionPRef,perlFunctionName,perlComment
  332. syn keyword perlStatementSub    sub contained
  333.  
  334. syn match  perlFunctionPrototype    "([^)]*)" contained
  335. if exists("perl_want_scope_in_variables")
  336.    syn match  perlFunctionPRef    "\h\w*::" contained
  337.    syn match  perlFunctionName    "\h\w*[^:]" contained
  338. else
  339.    syn match  perlFunctionName    "\h[[:alnum:]_:]*" contained
  340. endif
  341.  
  342.  
  343. " All other # are comments, except ^#!
  344. syn match  perlComment        "#.*" contains=perlTodo
  345. syn match  perlSharpBang    "^#!.*"
  346.  
  347. " Formats
  348. syn region perlFormat        matchgroup=perlStatementIOFunc start="^\s*format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain
  349. syn match  perlFormatName    "format\s\+\k\+\s*="lc=7,me=e-1 contained
  350. syn match  perlFormatField    "[@^][|<>~]\+\(\.\.\.\)\=" contained
  351. syn match  perlFormatField    "[@^]#[#.]*" contained
  352. syn match  perlFormatField    "@\*" contained
  353. syn match  perlFormatField    "@[^A-Za-z_|<>~#*]"me=e-1 contained
  354. syn match  perlFormatField    "@$" contained
  355.  
  356. " __END__ and __DATA__ clauses
  357. if exists("perl_fold")
  358.   syntax region perlDATA        start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD fold
  359. else
  360.   syntax region perlDATA        start="^__\(DATA\|END\)__$" skip="." end="." contains=perlPOD
  361. endif
  362.  
  363.  
  364. "
  365. " Folding
  366.  
  367. if exists("perl_fold")
  368.   syn region perlPackageFold start="^package \S\+;$" end="^1;$" end="^package"me=s-1 transparent fold keepend
  369.   syn region perlSubFold     start="^\z(\s*\)sub\>.*[^};]$" end="^\z1}\s*$" end="^\z1}\s*\#.*$" transparent fold keepend
  370.   syn region perlBEGINENDFold start="^\z(\s*\)\(BEGIN\|END\)\>.*[^};]$" end="^\z1}\s*$" transparent fold keepend
  371.   syn sync fromstart
  372.   setlocal foldmethod=syntax
  373. endif
  374.  
  375.  
  376. if version >= 508 || !exists("did_perl_syn_inits")
  377.   if version < 508
  378.     let did_perl_syn_inits = 1
  379.     command -nargs=+ HiLink hi link <args>
  380.   else
  381.     command -nargs=+ HiLink hi def link <args>
  382.   endif
  383.  
  384.   " The default highlighting.
  385.   HiLink perlSharpBang        PreProc
  386.   HiLink perlControl        PreProc
  387.   HiLink perlInclude        Include
  388.   HiLink perlSpecial        Special
  389.   HiLink perlString        String
  390.   HiLink perlCharacter        Character
  391.   HiLink perlNumber        Number
  392.   HiLink perlFloat        Float
  393.   HiLink perlType        Type
  394.   HiLink perlIdentifier        Identifier
  395.   HiLink perlLabel        Label
  396.   HiLink perlStatement        Statement
  397.   HiLink perlConditional    Conditional
  398.   HiLink perlRepeat        Repeat
  399.   HiLink perlOperator        Operator
  400.   HiLink perlFunction        Function
  401.   HiLink perlFunctionPrototype    perlFunction
  402.   HiLink perlComment        Comment
  403.   HiLink perlTodo        Todo
  404.   if exists("perl_string_as_statement")
  405.     HiLink perlStringStartEnd    perlStatement
  406.   else
  407.     HiLink perlStringStartEnd    perlString
  408.   endif
  409.   HiLink perlList        perlStatement
  410.   HiLink perlMisc        perlStatement
  411.   HiLink perlVarPlain        perlIdentifier
  412.   HiLink perlFiledescRead    perlIdentifier
  413.   HiLink perlFiledescStatement    perlIdentifier
  414.   HiLink perlVarSimpleMember    perlIdentifier
  415.   HiLink perlVarSimpleMemberName perlString
  416.   HiLink perlVarNotInMatches    perlIdentifier
  417.   HiLink perlVarSlash        perlIdentifier
  418.   HiLink perlQQ            perlString
  419.   if version >= 600
  420.     HiLink perlHereDoc        perlString
  421.   else
  422.     HiLink perlHereIdentifier    perlStringStartEnd
  423.     HiLink perlUntilEOFDQ    perlString
  424.     HiLink perlUntilEOFSQ    perlString
  425.     HiLink perlUntilEmptyDQ    perlString
  426.     HiLink perlUntilEmptySQ    perlString
  427.     HiLink perlUntilEOF        perlString
  428.   endif
  429.   HiLink perlStringUnexpanded    perlString
  430.   HiLink perlSubstitutionSQ    perlString
  431.   HiLink perlSubstitutionDQ    perlString
  432.   HiLink perlSubstitutionSlash    perlString
  433.   HiLink perlSubstitutionHash    perlString
  434.   HiLink perlSubstitutionBracket perlString
  435.   HiLink perlSubstitutionCurly    perlString
  436.   HiLink perlSubstitutionPling    perlString
  437.   HiLink perlTranslationSlash    perlString
  438.   HiLink perlTranslationHash    perlString
  439.   HiLink perlTranslationBracket    perlString
  440.   HiLink perlTranslationCurly    perlString
  441.   HiLink perlMatch        perlString
  442.   HiLink perlMatchStartEnd    perlStatement
  443.   HiLink perlFormatName        perlIdentifier
  444.   HiLink perlFormatField    perlString
  445.   HiLink perlPackageDecl    perlType
  446.   HiLink perlStorageClass    perlType
  447.   HiLink perlPackageRef        perlType
  448.   HiLink perlStatementPackage    perlStatement
  449.   HiLink perlStatementSub    perlStatement
  450.   HiLink perlStatementStorage    perlStatement
  451.   HiLink perlStatementControl    perlStatement
  452.   HiLink perlStatementScalar    perlStatement
  453.   HiLink perlStatementRegexp    perlStatement
  454.   HiLink perlStatementNumeric    perlStatement
  455.   HiLink perlStatementList    perlStatement
  456.   HiLink perlStatementHash    perlStatement
  457.   HiLink perlStatementIOfunc    perlStatement
  458.   HiLink perlStatementFiledesc    perlStatement
  459.   HiLink perlStatementVector    perlStatement
  460.   HiLink perlStatementFiles    perlStatement
  461.   HiLink perlStatementFlow    perlStatement
  462.   HiLink perlStatementScope    perlStatement
  463.   HiLink perlStatementInclude    perlStatement
  464.   HiLink perlStatementProc    perlStatement
  465.   HiLink perlStatementSocket    perlStatement
  466.   HiLink perlStatementIPC    perlStatement
  467.   HiLink perlStatementNetwork    perlStatement
  468.   HiLink perlStatementPword    perlStatement
  469.   HiLink perlStatementTime    perlStatement
  470.   HiLink perlStatementMisc    perlStatement
  471.   HiLink perlFunctionName    perlIdentifier
  472.   HiLink perlFunctionPRef    perlType
  473.   HiLink perlPOD        perlComment
  474.   HiLink perlShellCommand    perlString
  475.   HiLink perlSpecialAscii    perlSpecial
  476.   HiLink perlSpecialDollar    perlSpecial
  477.   HiLink perlSpecialString    perlSpecial
  478.   HiLink perlSpecialStringU    perlSpecial
  479.   HiLink perlSpecialMatch    perlSpecial
  480.   HiLink perlSpecialBEOM    perlSpecial
  481.   HiLink perlDATA        perlComment
  482.  
  483.   HiLink perlBrackets        Error
  484.  
  485.   " Possible errors
  486.   HiLink perlNotEmptyLine    Error
  487.   HiLink perlElseIfError    Error
  488.  
  489.   delcommand HiLink
  490. endif
  491.  
  492. " Syncing to speed up processing
  493. "
  494. if !exists("perl_no_sync_on_sub")
  495.   syn sync match perlSync    grouphere NONE "^\s*package\s"
  496.   syn sync match perlSync    grouphere perlFunction "^\s*sub\s"
  497.   syn sync match perlSync    grouphere NONE "^}"
  498. endif
  499.  
  500. if !exists("perl_no_sync_on_global_var")
  501.   syn sync match perlSync    grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
  502.   syn sync match perlSync    grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
  503. endif
  504.  
  505. if exists("perl_sync_dist")
  506.   execute "syn sync maxlines=" . perl_sync_dist
  507. else
  508.   syn sync maxlines=100
  509. endif
  510.  
  511. syn sync match perlSyncPOD    grouphere perlPOD "^=pod"
  512. syn sync match perlSyncPOD    grouphere perlPOD "^=head"
  513. syn sync match perlSyncPOD    grouphere perlPOD "^=item"
  514. syn sync match perlSyncPOD    grouphere NONE "^=cut"
  515.  
  516. let b:current_syntax = "perl"
  517.  
  518. " vim: ts=8
  519.